Python | @classmethod @staticmethod区别

Python | @classmethod @staticmethod区别

Python中有三种方式定义类方法:

  • 常规方法;
  • @classmethod修饰方法;
  • @staticmathod修饰方式。

执行:

输出:

1. 定义方式

普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。@classmethod修饰的方法class_foo()需要通过cls参数传递当前的类对象。@staticmethod修饰的方法定义与普通函数是一样的。

self和cls的区别不是强制的,只是PEP8中一种编程风格,self通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通常用self来传递当前类对象的实例,cls传递当前类对象。

2. 绑定对象

# foo方法绑定对象A的实例,class_foo方法绑定对象A,static_foo没有参数绑定
>>> print(a.foo)  

输出:

>>> print(a.class_foo)
<bound method A.class_foo of <class '__main__.A'>>
>>> print(a.static_foo)
<function A.static_foo at 0x000001A1026F5840>

3. 调用方式

foo可通过实例a调用,类对象A直接调用会参数错误。

>>> a.foo(l)  

输出:

A.foo(1)

输出:

但foo如下方式可以使用正常,显式的传递实例参数a。

A.foo(a, 1)

输出:

class_foo通过类对象或对象实例调用。

>>> A.class_foo(1)  

输出:

>>> a.class_foo(1)

输出:

-------------本文结束感谢您的阅读-------------
0%